package com.neusoft.hifly;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Title: API 网关
 * <p>
 * Description: 基于Mysql + Redis实现分布式动态网关
 * <p>
 * 为什么使用Mysql的同时，又要使用Redis？
 * <p>
 * 1、Spring Cloud Gateway 基于webflux 背压，暂时不支持mysql 数据库
 * <p>
 * 2、Redis-reactive 支持 Spring Cloud Gateway 的背压，同时还可以实现分布式，高性能
 * <p>
 * 官方默认提供了这些接口进行网关的管理，例如获取所有的路由：http://127.0.0.1:9000/actuator/gateway/routes
 * <p>
 * Copyright: 2019
 * <p>
 * Company: 东软汉枫
 *
 * @author lh_neu
 * @version 1.0.0
 */
@EnableDiscoveryClient
@RestController
@RefreshScope
@SpringBootApplication
public class Application {
	@Autowired(required = false)
	private ApplicationEventPublisher publisher;

	public static void main(final String[] args) {
		SpringApplication.run(Application.class, args);
	}

	@Value("${server.port:9000}")
	private int port;

	@Value("${company.name:未连接配置中心}")
	private String companyName;

	/**
	 * 手动刷新路由配置
	 * 
	 * @return 服务端口号
	 */
	@RequestMapping("/refresh")
	public int refresh() {
		publisher.publishEvent(new RefreshRoutesEvent(this));
		return port;
	}

	/**
	 * 服务端口号
	 * 
	 * @return 服务端口号
	 */
	@RequestMapping("/port")
	public int port() {
		return port;
	}

	/**
	 * 输出企业名称（配置中心的）
	 * 
	 * @return 企业名称
	 */
	@RequestMapping("/companyName")
	public String companyName() {
		return companyName;
	}
}
